﻿#pragma once

#pragma pack(push, 1)

struct PMSG_GridItem
{
    BYTE position;
    BYTE itemType;
    BYTE itemAttr1;
    BYTE itemAttr2;
};

// 玩家身上的装备信息
struct PMSG_EquipmentInfo
{
    BYTE leftHand_t2 : 4;
    BYTE leftHand_t1 : 4;
    BYTE rightHand_t2 : 4;
    BYTE rightHand_t1 : 4;
    BYTE upper : 4;	//铠
    BYTE head : 4;	//头
    BYTE glove : 4;	//手
    BYTE lower : 4;	//腿
    BYTE angel : 2;	//守护
    BYTE wing : 2;	//翅膀
    BYTE boot : 4;	//靴子
    BYTE f[3];
    BYTE flags;
};

// 发送的数据包

// F1 01 登录时发送的信息
struct PMSG_Login
{
    char username[10];
    char password[10];
    DWORD tickCount;
    char versionString[3];	//版本号 074
    char verificationString[17];	//验证码 subv(*40ds7lkN2n
};

// F3 01 发送创建人物命令
struct PMSG_CreateCharacter
{
    char name[10];
    BYTE muClass;
};

// 收到的数据包

// 00 玩家消息
struct PMSG_PlayerMessage
{
    char name[10];
    char message[60];
};

// 01 npc消息
struct PMSG_NpcMessage
{
    WORD gameObjId;
    char message[60];
};

// 0D 收到通知
struct PMSG_SystemNotice
{
    BYTE msgType;
    char msg[1];
};

// 10 收到走动信息
struct PMSG_GameObjMove
{
    WORD gameObjId;	//网络序
    BYTE x, y;
    BYTE dir;
};

// 12 周围出现玩家
struct PMSG_MeetThePlayer
{
    struct Player
    {
        WORD gameObjId;	//网络序
        BYTE x1, y1;
        BYTE muClass;
        PMSG_EquipmentInfo equipment;
        char name[10];
        BYTE x2, y2;
        BYTE dir;
    };

    BYTE count;
    Player players[1];
};

// 13 周围出现怪物
struct PMSG_MeetTheMonster
{
    struct Monster
    {
        WORD gameObjId;	//网络序
        BYTE typeIndex;
        BYTE flags;
        BYTE x1, y1;
        BYTE x2, y2;
        BYTE dir;
    };

    BYTE count;
    Monster monsters[1];
};

// 14 超出范围移除目标
struct PMSG_GameObjOutOfRange
{
    BYTE count;
    WORD gameObjIds[1];	//网络序
};

// 15 掉血
struct PMSG_BloodLoss
{
    WORD gameObjId;	//网络序
    WORD loss; //网络序 损失多少血
};

// 16 杀死怪获得经验
struct PMSG_KillMonster
{
    WORD monster;
    WORD exp;
    WORD lossOfBlood;
};
// 18 作出动作 站 坐 普通攻击 跳舞。。。
struct PMSG_GameObjAction
{
    WORD gameObjId;	//网络序
    BYTE dir;
    BYTE action;
};

// 19 使用单体技能
struct PMSG_UseSingleSkill
{
    BYTE skillId;
    WORD user;
    WORD target;
};

// 1C 进入传送门
struct PMSG_EnterTheGate
{
    BYTE gateNumber;
    BYTE destMapNumber;
    BYTE x, y;
    BYTE dir;
};

// 1E 使用范围技能
struct PMSG_UseRangeSkill
{
    BYTE skillId;
    WORD user;
    BYTE x;
    BYTE y;
    BYTE dir;
};

// 1F 遇见召唤兽
struct PMSG_MeetTheSummon
{
    struct Summon
    {
        WORD gameObjId;
        BYTE monsterId;
        BYTE flags;
        BYTE x1, y1, x2, y2;
        BYTE dir;
        char ownerName[10];
    };

    BYTE count;
    Summon summons[1];
};

// 20 地上出现物品
struct PMSG_ItemsOnGround
{
    struct Item
    {
        WORD itemNumber;
        BYTE x, y;
        BYTE itemType;
        BYTE moneyOrAttr[3];    // 如果是属性，结构体长度-1, attr[0] 可能 低3位是追，第4位是幸运，高4位是加
    };

    BYTE count;
    Item items[1];
};

// 21 地上物品消失
struct PMSG_ItemsLostOnGround
{
    BYTE count;
    WORD itemNumbers[1];
};

// 23 丢弃物品
struct PMSG_DiscardItem
{
    BYTE v1;
    BYTE position;
};

// 24 移动物品
struct PMSG_MoveItem
{
    BYTE v1;
    PMSG_GridItem gridItem;
};

// 26 生命值 27 魔法值改变
struct PMSG_LifeManaChange
{
    BYTE flags;
    WORD number;
};

// 2A 使用治疗魔法药水
struct PMSG_UsePotion
{
    BYTE flags;
    BYTE number;
    BYTE v2;
};

// 31 商店物品
struct PMSG_ShopItems
{
    BYTE flags;
    BYTE count;
    PMSG_GridItem gridItems[1];
};

// 33 卖出物品加钱
struct PMSG_SellItem
{
    BYTE flags;
    DWORD money;
};

// 42 队伍信息
struct PMSG_TeamInfo
{
    struct Player
    {
        char name[10];
        BYTE v1, v2, v3, v4;
    };

    BYTE v1;
    BYTE playerCount;
    Player players[1];
};

// 52 战盟信息
struct PMSG_GuildInfo
{
    struct Player
    {
        char name[10];
        BYTE v1;
    };

    BYTE v1;
    BYTE playerCount;
    WORD v2;
    DWORD score;
    DWORD v3;
    Player players[1];
};

// F1 00 发送完登录信息后收到
struct PMSG_GameObjIdAndVersion
{
    BYTE f;
    WORD gameObjId;	//网络序
    char version[3];
};

// F3 00 登录后收到角色预览列表
struct PMSG_CharacterList
{
    struct Character
    {
        BYTE position;
        char name[11];
        WORD level;
        BYTE muClass;
        PMSG_EquipmentInfo equipment;
    };

    BYTE count;
    Character chars[1];
};

// F3 01 返回创建人物结果
struct PMSG_CreateCharacter_result
{
    BYTE result;
    char name[10];
    BYTE position;
    BYTE f[24];
};

// F3 03 选择人物进入游戏后收到的属性信息
struct PMSG_CharacterInfo
{
    BYTE x, y;	// 坐标
    BYTE mapNumber;	// 地图编号
    BYTE x1;	// 未知
    DWORD exp;	// 经验
    DWORD expUp;	// 升级经验
    WORD lvUpPoint;	// 剩余属性点
    WORD str, dex, vit, ene;	// 力量，敏捷，体力，智力
    WORD life, maxlife;	// 生命
    WORD mana, maxMana;	// 魔法
    WORD f;	// 未知
    DWORD money;	// 钱
    DWORD pkLv;	// pk等级
};

// F3 04 角色复活
struct PMSG_CharacterRelive
{
    BYTE x, y, mapIndex, dir;
    WORD life, mana;
    DWORD exp, money;
};

// F3 05 玩家升级，属性改变
struct PMSG_PlayerLevelUp
{
    WORD level;
    WORD levelUpPoint;
    WORD maxLife;
    WORD maxMana;
};

// F3 06 属性点加1
struct PMSG_IncAttributePoint
{
    BYTE attr : 4;
    BYTE : 4;
    BYTE reserved1;
    WORD n;
};

// F3 10 玩家物品栏数据
struct PMSG_PlayerBagItems
{
    BYTE count;
    PMSG_GridItem gridItems[1];
};

// F3 11 玩家技能数据
struct PMSG_PlayerSkillData
{
    struct Skill
    {
        BYTE pos;
        BYTE code;
        BYTE reserved1;
    };

    BYTE count;
    Skill skills[1];
};

// F4 02 服务器列表信息
struct PMSG_ServerList
{
    struct Server
    {
        BYTE code;
        BYTE rate;
    };

    BYTE count;
    Server servers[1];
};

// F4 03 选择线后收到的
struct PMSG_ServerAddr
{
    char ip[16];
    WORD port;
};

#pragma pack(pop)
